home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / GRAPHICS / EDMAP32 / EDMAP32A.GFA (.txt) < prev    next >
Encoding:
GFA-BASIC Atari  |  2010-01-01  |  13.7 KB  |  816 lines

  1. RESERVE 64*1024
  2. good_color|=15
  3. ON BREAK GOSUB quit
  4. CLS
  5. DEFMOUSE 0
  6. souris_block|=5
  7. rez%=XBIOS(4)
  8. IF rez%<>0
  9.   ALERT 1,"ST LOW-RES ONLY",1,"[ CHANGE ]",dummy%
  10.   END
  11. ENDIF
  12. current_path$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)+"\"
  13. path_pi1$=current_path$+"*.blk"
  14. path_map$=current_path$+"*.map"
  15. bugbuster$=STRING$(100*40,0)
  16. freemem%=GEMDOS(72,L:-1)
  17. freemem%=freemem%-4*1024 !JUST FOR 512ko machines compatibility !
  18. adr_free%=GEMDOS(72,L:freemem%)
  19. memory%=adr_free%
  20. palette%=adr_free%
  21. @mem(32)
  22. sav_screen%=adr_free%
  23. @mem(32000)
  24. icone%=adr_free%
  25. @mem(2560)
  26. color%=adr_free%
  27. @mem(32)
  28. old_buffer%=adr_free%
  29. @mem(2)
  30. FOR t|=0 TO 15
  31.   ink%=XBIOS(7,t|,-1)
  32.   DPOKE color%+t|*2,ink%
  33. NEXT t|
  34. art%=adr_free%
  35. @mem(900)
  36. BLOAD "edmap3_2.b",art%
  37. art2%=art%+4
  38. click%=adr_free%
  39. @mem(100)
  40. BLOAD "click.b",click%
  41. ~C:click%()
  42. block_buffer%=adr_free%
  43. @mem(480)       !20*12*2
  44. map%=adr_free%
  45. @mem(64*1024)
  46. buffer%=adr_free%
  47. @mem(2)
  48. screen%=adr_free%
  49. ligne%=0
  50. '
  51. '
  52. '
  53. HIDEM
  54. @affich_ic
  55. @charge_blk
  56. @affiche_ligne_block
  57. block_set%=9
  58. block%=9
  59. @inverse_old
  60. SHOWM
  61. '
  62. largeur&=40
  63. hauteur&=20
  64. taille%=largeur&*hauteur&*2
  65. @clear
  66. @affiche_infos
  67. ' *****************************************************************************
  68. main_loop:
  69. @test_mous
  70. IF block%<>20
  71.   IF block%<>block_set%
  72.     block_set%=block%
  73.     @inverse_block
  74.   ENDIF
  75. ENDIF
  76. ON box% GOSUB charge_blk,load_map,save_map,clear_r,change_size,bl_left,bl_right,info,change_color,left,up,down,right,get_block,paste_block,pick_block,dummy,dummy,undo,quit
  77. IF box%>29
  78.   r_but%=box%-30
  79.   ON r_but% GOSUB dummy,dummy,dummy,dummy,dummy,big_left,big_right,dummy,dummy,left,up,down,right
  80. ENDIF
  81. GOTO main_loop
  82. ' ******************************************************************************
  83. > PROCEDURE dummy
  84. RETURN
  85. > PROCEDURE affiche_infos
  86.   TEXT 0,166,"WIDTH:"
  87.   TEXT 64,166,"   "
  88.   TEXT 64,166,largeur&
  89.   TEXT 96,166,"HEIGHT:"
  90.   TEXT 160,166,"   "
  91.   TEXT 160,166,hauteur&
  92.   TEXT 192,166,"XPOS:"
  93.   TEXT 232,166,"   "
  94.   TEXT 232,166,x_window&
  95.   TEXT 256,166,"YPOS:"
  96.   TEXT 296,166,"   "
  97.   TEXT 296,166,y_window&
  98. RETURN
  99. > PROCEDURE info
  100.   HIDEM
  101.   BMOVE XBIOS(3),sav_screen%,32000
  102.   ~XBIOS(6,L:color%)
  103.   CLS
  104.   PRINT "              EDMAP V3.2"
  105.   PRINT "                  BY"
  106.   PRINT "              BUG BUSTER"
  107.   PRINT "                 from"
  108.   PRINT "             ART  OF  CODE"
  109.   PRINT "    As no other Map Editor is swapped"
  110.   PRINT "  officially, I decided to release mine."
  111.   PRINT "  I hope you'll like it !"
  112.   PRINT "  If you use it, and like it, please"
  113.   PRINT "  credit me in your demos and games"
  114.   PRINT
  115.   PRINT "   My adress is:"
  116.   PRINT "           STEPHANE LANDIER"
  117.   PRINT "          23, RUE DES ECOLES"
  118.   PRINT "        41100 THORE LA ROCHETTE"
  119.   PRINT "          TEL:54-72-71-40"
  120.   PRINT
  121.   PRINT " I AM NOT INTERESTED IN CRACKED SOFTS !"
  122.   PRINT "P.S:Now there are keyboard-cuts for SSM"
  123.   PRINT "& block functions for DUNS of VOYAGERS"
  124.   ~INP(2)
  125.   CLS
  126.   PRINT "Art Of Code has signed a pact with The"
  127.   PRINT "Voyagers to make demos together."
  128.   PRINT "The Alliance is called ENIGMA !"
  129.   PRINT ""
  130.   PRINT "I would like to greet, in no special"
  131.   PRINT "order: RESCATOR,LCC,SHURIKENS,DUNS"
  132.   PRINT "Of Voyagers+Speeder for being cool guys!"
  133.   PRINT ""
  134.   PRINT "Hello Future Minds your Coding Party"
  135.   PRINT "was very cool !"
  136.   ~INP(2)
  137.   ~XBIOS(6,L:palette%)
  138.   BMOVE sav_screen%,XBIOS(3),32000
  139.   SHOWM
  140. RETURN
  141. > PROCEDURE left
  142.   @set_step
  143.   x_window&=x_window&-step|
  144.   IF x_window&<0
  145.     x_window&=0
  146.   ENDIF
  147.   @affiche_map
  148. RETURN
  149. > PROCEDURE up
  150.   @set_step
  151.   y_window&=y_window&-step|
  152.   IF y_window&<0
  153.     y_window&=0
  154.   ENDIF
  155.   @affiche_map
  156. RETURN
  157. > PROCEDURE down
  158.   @set_step
  159.   y_window&=y_window&+step|
  160.   IF y_window&>(hauteur&-10)
  161.     y_window&=hauteur&-10
  162.   ENDIF
  163.   @affiche_map
  164. RETURN
  165. > PROCEDURE right
  166.   @set_step
  167.   x_window&=x_window&+step|
  168.   IF x_window&>(largeur&-20)
  169.     x_window&=(largeur&-20)
  170.   ENDIF
  171.   @affiche_map
  172. RETURN
  173. > PROCEDURE set_step
  174.   IF box%>=40
  175.     step|=5
  176.   ELSE
  177.     step|=1
  178.   ENDIF
  179. RETURN
  180. > PROCEDURE big_left
  181.   ligne%=ligne%-2560
  182.   IF ligne%<0
  183.     ligne%=0
  184.   ENDIF
  185.   @tempo
  186.   @affiche_ligne_block
  187.   @inverse_old
  188. RETURN
  189. > PROCEDURE bl_left
  190.   ligne%=ligne%-128
  191.   IF ligne%<0
  192.     ligne%=0
  193.   ENDIF
  194.   @affiche_ligne_block
  195.   @inverse_old
  196. RETURN
  197. > PROCEDURE big_right
  198.   FOR t%=0 TO 19
  199.     IF ligne%<(nb_bloc&-20)*128
  200.       ligne%=ligne%+128
  201.     ENDIF
  202.   NEXT t%
  203.   @tempo
  204.   @affiche_ligne_block
  205.   @inverse_old
  206. RETURN
  207. > PROCEDURE bl_right
  208.   IF ligne%<(nb_bloc&-20)*128
  209.     ligne%=ligne%+128
  210.   ENDIF
  211.   @affiche_ligne_block
  212.   @inverse_old
  213. RETURN
  214. ' *******************************************************************************
  215. > PROCEDURE get_block
  216.   COLOR good_color|
  217.   REPEAT
  218.   UNTIL MOUSEK=0
  219.   DEFMOUSE souris_block|
  220.   REPEAT
  221.     @affiche_map
  222.     x_start&=(MOUSEX AND &HFFF0)
  223.     y_start&=(MOUSEY AND &HFFF0)
  224.     flag_out|=0
  225.     IF y_start&>144
  226.       y_start&=144
  227.       flag_out|=1
  228.     ENDIF
  229.     LINE 0,y_start&,319,y_start&
  230.     LINE x_start&,0,x_start&,159
  231.   UNTIL MOUSEK=1
  232.   IF flag_out|=1
  233.     PRINT CHR$(7)
  234.     GOTO fin_get_block
  235.   ENDIF
  236.   IF y_start&>144
  237.     y_start&=144
  238.   ENDIF
  239.   REPEAT
  240.     @affiche_map
  241.     x_end&=(MOUSEX AND &HFFF0)+15 !si bug enlever les ANDs
  242.     y_end&=(MOUSEY AND &HFFF0)+15
  243.     IF x_end&<=x_start&
  244.       x_end&=x_start&+15
  245.     ENDIF
  246.     IF y_end&<=y_start&
  247.       y_end&=y_start&+15
  248.     ENDIF
  249.     IF y_end&>159
  250.       y_end&=159
  251.     ENDIF
  252.     LINE x_start&,y_start&,x_end&,y_start&
  253.     LINE x_end&,y_start&,x_end&,y_end&
  254.     LINE x_end&,y_end&,x_start&,y_end&
  255.     LINE x_start&,y_end&,x_start&,y_start&
  256.   UNTIL MOUSEK<>1
  257.   x_start&=x_start&/16
  258.   y_start&=y_start&/16
  259.   x_end&=(x_end&/16)+1 !si bug rajouter 1 a x et y_end&
  260.   y_end&=(y_end&/16)+1
  261.   hauteur_du_block&=(y_end&-y_start&)-1
  262.   largeur_du_block&=(x_end&-x_start&)
  263.   block_buffer2%=block_buffer%
  264. copie_dans_buffer:
  265.   adr_ds_map_du_buffer%=map%+((x_window&+x_start&+(y_window&+y_start&)*largeur&)*2)
  266.   BMOVE adr_ds_map_du_buffer%,block_buffer2%,largeur_du_block&*2
  267.   block_buffer2%=block_buffer2%+largeur_du_block&*2
  268.   INC y_start&
  269.   IF y_start&<y_end&
  270.     GOTO copie_dans_buffer
  271.   ENDIF
  272. fin_get_block:
  273.   REPEAT
  274.   UNTIL MOUSEK=0
  275.   @affiche_map
  276.   DEFMOUSE 0
  277. RETURN
  278. > PROCEDURE paste_block
  279.   REPEAT
  280.   UNTIL MOUSEK=0
  281.   DEFMOUSE souris_block|
  282.   REPEAT
  283.     x&=MOUSEX
  284.     y&=MOUSEY
  285.   UNTIL MOUSEK=1
  286.   IF y&>159
  287.     PRINT CHR$(7)
  288.     GOTO fin_paste
  289.   ENDIF
  290.   x&=x&/16
  291.   y&=y&/16
  292.   IF x_window&+x&+largeur_du_block&>largeur&
  293.     PRINT CHR$(7)
  294.     @depasse
  295.     GOTO fin_paste
  296.   ENDIF
  297.   IF y_window&+y&+hauteur_du_block&>hauteur&
  298.     PRINT CHR$(7)
  299.     @depasse
  300.     GOTO fin_paste
  301.   ENDIF
  302.   block_buffer2%=block_buffer%
  303.   yhauteur&=y&+hauteur_du_block&
  304. paste_block:
  305.   adr_ds_map%=map%+((x_window&+x&+(y_window&+y&)*largeur&)*2)
  306.   BMOVE block_buffer2%,adr_ds_map%,largeur_du_block&*2
  307.   ADD block_buffer2%,largeur_du_block&*2
  308.   INC y&
  309.   IF y&<=yhauteur&
  310.     GOTO paste_block
  311.   ENDIF
  312.   @affiche_map
  313. fin_paste:
  314.   DEFMOUSE 0
  315.   REPEAT
  316.   UNTIL MOUSEK=0
  317. RETURN
  318. > PROCEDURE depasse
  319.   ALERT 1," THE OBJECT WOULD BE |    OUT OF THE MAP ! ",1,"[OK]",dummy%
  320. RETURN
  321. > PROCEDURE undo
  322.   adr_ds_map%=map%+((undo_x_window&+undo_map_x&+(undo_y_window&+undo_map_y&)*largeur&)*2)
  323.   BMOVE old_buffer%,adr_ds_map%,2
  324.   x_window&=undo_x_window&
  325.   y_window&=undo_y_window&
  326.   @affiche_map
  327.   flag_undo|=1
  328. RETURN
  329. > PROCEDURE quit
  330.   ALERT 3,"DO YOU REALLY WANNA QUIT ?",1,"[OUI]|NON",dummy%
  331.   IF dummy%<>2
  332.     click%=click%+2
  333.     ~C:click%()
  334.     ~XBIOS(6,L:color%)
  335.     a%=GEMDOS(73,L:memory%)
  336.     END
  337.   ENDIF
  338. RETURN
  339. '
  340. > PROCEDURE tempo
  341.   VSYNC
  342.   VSYNC
  343.   VSYNC
  344.   VSYNC
  345.   VSYNC
  346. RETURN
  347. > PROCEDURE clear_r
  348.   ALERT 1,"CLEAR ?",1,"[OK]|CANCEL",dummy%
  349.   IF dummy%<>2
  350.     @clear
  351.   ENDIF
  352. RETURN
  353. > PROCEDURE clear
  354.   FOR t%=map% TO map%+taille%
  355.     POKE t%,0
  356.   NEXT t%
  357.   @affiche_map
  358.   map_x&=0
  359.   map_y&=0
  360.   x_window&=0
  361.   y_window&=0
  362. RETURN
  363. > PROCEDURE change_size
  364.   ALERT 3,"CHANGE SIZE ?",1,"OK|[CANCEL]",dummy%
  365.   IF dummy%<>2
  366.     HIDEM
  367.     BMOVE XBIOS(3),sav_screen%,32000
  368.     ~XBIOS(6,L:color%)
  369.     CLS
  370.   ask1:
  371.     INPUT "WIDTH (>19) ";largeur&
  372.     IF largeur&<20
  373.       GOTO ask1
  374.     ENDIF
  375.   ask2:
  376.     INPUT "HEIGHT (>9) ";hauteur&
  377.     IF hauteur&<10
  378.       GOTO ask2
  379.     ENDIF
  380.     @init_map
  381.     IF over%<0
  382.       ALERT 1,"TOO BIG |NOT ENOUGH MEMORY",1,"[OK]",dummy%
  383.       GOTO ask1
  384.     ENDIF
  385.     PRINT "CLEARING MAP-PLEASE WAIT !"
  386.     @clear
  387.     ~XBIOS(6,L:palette%)
  388.     BMOVE sav_screen%,XBIOS(3),32000
  389.     SHOWM
  390.     @affiche_map
  391.     @affiche_ligne_block
  392.     @inverse_old
  393.   ENDIF
  394. RETURN
  395. > PROCEDURE affich_ic
  396.   BLOAD "edmap3_2.rsc",icone%
  397.   flag%=0
  398.   @change_plan
  399. RETURN
  400. > PROCEDURE change_color
  401.   ALERT 1,"WHAT COLOR DO YOU WHISH|TO CHANGE ?",1,"[BACK]|[ICON]|[LINE]",dummy%
  402.   SELECT dummy%
  403.   CASE 1
  404.     @change_fond
  405.   CASE 2
  406.     @change_plan
  407.   CASE 3
  408.     @change_trait
  409.   ENDSELECT
  410. RETURN
  411. > PROCEDURE change_fond
  412.   @tempo
  413.   fond&=DPEEK(palette%)
  414.   fond&=fond& XOR &HFFF
  415.   DPOKE palette%,fond&
  416.   ~XBIOS(6,L:palette%)
  417. RETURN
  418. > PROCEDURE change_plan
  419.   @tempo
  420.   flag%=flag% XOR 2
  421.   BMOVE icone%,XBIOS(2)+29440+flag%,2560
  422. RETURN
  423. > PROCEDURE change_trait
  424.   good_color|=good_color| XOR 1
  425. RETURN
  426. > PROCEDURE test_mous
  427. debut_test:
  428.   @affiche_infos
  429.   REPEAT
  430.     a$=INKEY$
  431.     bouton%=MOUSEK
  432.   UNTIL bouton%=1 OR bouton%=2 OR LEN(a$)<>0
  433.   IF LEN(a$)<>0
  434.     IF a$="8"
  435.       @up
  436.     ENDIF
  437.     IF a$="2"
  438.       @down
  439.     ENDIF
  440.     IF a$="4"
  441.       @left
  442.     ENDIF
  443.     IF a$="6"
  444.       @right
  445.     ENDIF
  446.     IF a$="1"
  447.       @bl_left
  448.     ENDIF
  449.     IF a$="3"
  450.       @bl_right
  451.     ENDIF
  452.     IF a$="7"
  453.       @big_left
  454.     ENDIF
  455.     IF a$="9"
  456.       @big_right
  457.     ENDIF
  458.     GOTO debut_test
  459.   ENDIF
  460.   y%=MOUSEY
  461.   x%=MOUSEX
  462.   IF y%<160
  463.     map_y&=INT(y%/16)
  464.     map_x&=INT(x%/16)
  465.     box%=0
  466.     IF flag_undo|=1
  467.       GOTO suite
  468.     ENDIF
  469.     IF flag_undo2%=0
  470.       GOTO suite
  471.     ENDIF
  472.     IF map_y&<>old_map_y&
  473.       GOTO suite
  474.     ENDIF
  475.     IF map_x&<>old_map_x&
  476.       GOTO suite
  477.     ENDIF
  478.     IF bouton%<>old_bouton%
  479.       GOTO suite
  480.     ENDIF
  481.     GOTO end_loop2
  482.   suite:
  483.     IF bouton%=1
  484.       @ok
  485.       flag_undo2%=1
  486.     ENDIF
  487.     IF bouton%=2
  488.       @clear_bloc
  489.       flag_undo2%=1
  490.     ENDIF
  491.     GOTO end_loop2
  492.   ENDIF
  493.   IF bouton%=2
  494.     IF y%>184
  495.       box%=INT(x%/16)+31
  496.       flag_undo2%=0
  497.       GOTO end_loop2
  498.     ENDIF
  499.   ENDIF
  500.   IF y%>184
  501.     box%=INT(x%/16)+1
  502.     flag_undo2%=0
  503.     GOTO end_loop2
  504.   ENDIF
  505.   IF y%>184-16
  506.     box%=21
  507.     block%=INT(x%/16)
  508.     flag_undo2%=0
  509.   ENDIF
  510. end_loop2:
  511.   old_map_x&=map_x&
  512.   old_map_y&=map_y&
  513.   old_bouton%=bouton%
  514.   flag_undo|=0
  515. RETURN
  516. '
  517. > PROCEDURE init_map
  518.   over%=0
  519.   taille%=hauteur&*largeur&*2
  520.   IF map%+taille%>=screen%
  521.     over%=-1
  522.   ENDIF
  523. RETURN
  524. > PROCEDURE charge_blk
  525. again:
  526.   path$=path_pi1$
  527.   titre$="LOADING BLOCKS"
  528.   @fileselector
  529.   IF RIGHT$(file$)="\"
  530.     ALERT 3,"Il est ou le fichier ?",1,"Bonchien",dummy%
  531.     GOTO again
  532.   ENDIF
  533.   IF file$=""
  534.     IF flag&=1
  535.       GOTO fin_charge_blk
  536.     ENDIF
  537.     GOTO again
  538.   ENDIF
  539.   file2&=INSTR(file$,".")
  540.   file2$=LEFT$(file$,file2&)
  541.   file2$=file2$+"PAL"
  542.   IF EXIST(file$)
  543.     OPEN "i",#1,file$
  544.     long%=LOF(#1)
  545.     IF long%>=freemem%
  546.       CLOSE #1
  547.       ALERT 1,"NOT ENOUGH MEMORY",1,"[OK]",dummy%
  548.       GOTO fin_charge_blk
  549.     ENDIF
  550.     BGET #1,screen%,long%
  551.     CLOSE #1
  552.     nb_bloc&=long%/128
  553.     ligne%=0
  554.     @affiche_ligne_block
  555.     @inverse_old
  556.     @clear
  557.     flag&=1
  558.   ENDIF
  559.   IF EXIST(file2$)
  560.     OPEN "i",#1,file2$
  561.     BGET #1,palette%,32
  562.     ~XBIOS(6,L:palette%)
  563.     CLOSE #1
  564.   ENDIF
  565. fin_charge_blk:
  566. RETURN
  567. '
  568. > PROCEDURE fileselector
  569.   FILESELECT #titre$,path$,fich_prop$,file$
  570. RETURN
  571. '
  572. > PROCEDURE affiche_ligne_block
  573.   LPOKE art%+16,screen%+ligne%
  574.   ~C:art%()
  575. RETURN
  576. '
  577. > PROCEDURE inverse_old
  578.   old_block%=block_set%
  579.   HIDEM
  580.   adr%=XBIOS(2)+26880
  581.   offset%=adr%+old_block%*8
  582.   @inv
  583.   SHOWM
  584. RETURN
  585. '
  586. > PROCEDURE inverse_block
  587.   HIDEM
  588.   adr%=XBIOS(2)+26880
  589.   offset%=adr%+old_block%*8
  590.   @inv
  591.   old_block%=block_set%
  592.   offset%=adr%+block_set%*8
  593.   @inv
  594. fin_inv:
  595.   SHOWM
  596. RETURN
  597. '
  598. > PROCEDURE inv
  599.   FOR t%=0 TO 15
  600.     a%=LPEEK(offset%)
  601.     a%=a% XOR &H4
  602.     LPOKE offset%,a%
  603.     offset%=offset%+160
  604.   NEXT t%
  605. RETURN
  606. '
  607. > PROCEDURE ok
  608.   undo_map_x&=map_x&
  609.   undo_map_y&=map_y&
  610.   undo_x_window&=x_window&
  611.   undo_y_window&=y_window&
  612.   undo_ligne%=ligne%
  613.   adr_ds_map%=map%+((x_window&+map_x&+(y_window&+map_y&)*largeur&)*2)
  614.   BMOVE adr_ds_map%,old_buffer%,2
  615.   DPOKE adr_ds_map%,ligne%/128+block_set%
  616.   mask%=&HFFFFFFFF
  617.   dest%=XBIOS(2)+map_y&*(160*16)+map_x&*8
  618.   source%=screen%+ligne%+block_set%*128
  619.   FOR t%=0 TO 15
  620.     BMOVE source%,dest%,8
  621.     source%=source%+8
  622.     dest%=dest%+160
  623.   NEXT t%
  624. RETURN
  625. '
  626. > PROCEDURE clear_bloc
  627.   undo_map_x&=map_x&
  628.   undo_map_y&=map_y&
  629.   undo_x_window&=x_window&
  630.   undo_y_window&=y_window&
  631.   undo_ligne%=ligne%
  632.   adr_ds_map%=map%+((x_window&+map_x&+(y_window&+map_y&)*largeur&)*2)
  633.   BMOVE adr_ds_map%,old_buffer%,2
  634.   DPOKE adr_ds_map%,0
  635.   @clear_bloc2
  636. RETURN
  637. '
  638. > PROCEDURE clear_bloc2
  639.   dest%=XBIOS(2)+map_y&*(16*160)+map_x&*8
  640.   source%=screen%
  641.   FOR t%=0 TO 15
  642.     BMOVE source%,dest%,8
  643.     source%=source%+8
  644.     dest%=dest%+160
  645.   NEXT t%
  646. RETURN
  647. '
  648. > PROCEDURE mem(nombre%)
  649.   ADD adr_free%,nombre%
  650.   SUB freemem%,nombre%
  651. RETURN
  652. '
  653. > PROCEDURE affiche_map
  654.   HIDEM
  655.   LPOKE art%+6,map%
  656.   DPOKE art%+10,x_window&
  657.   DPOKE art%+12,y_window&
  658.   DPOKE art%+14,largeur&
  659.   LPOKE art%+16,screen%
  660.   DPOKE art%+20,9
  661.   ~C:art2%()
  662.   SHOWM
  663. RETURN
  664. > PROCEDURE affiche_map2
  665.   HIDEM
  666.   LPOKE art%+6,V:bugbuster$
  667.   DPOKE art%+10,0
  668.   DPOKE art%+12,y_pick&
  669.   DPOKE art%+14,20
  670.   LPOKE art%+16,screen%
  671.   DPOKE art%+20,11
  672.   ~C:art2%()
  673.   SHOWM
  674. RETURN
  675. '
  676. > PROCEDURE load_map
  677.   path$=path_map$
  678.   titre$="LOADING MAP"
  679.   @fileselector
  680.   IF RIGHT$(file$)="\"
  681.     ALERT 3,"Il est ou le fichier ?",1,"Bonchien",dummy%
  682.     GOTO fin_load_map
  683.   ENDIF
  684.   IF file$=""
  685.     GOTO fin_load_map
  686.   ENDIF
  687.   IF EXIST(file$)
  688.     OPEN "i",#1,file$
  689.     BGET #1,buffer%,2
  690.     largeur&=DPEEK(buffer%)
  691.     BGET #1,buffer%,2
  692.     hauteur&=DPEEK(buffer%)
  693.     @init_map
  694.     @clear
  695.     BGET #1,map%,taille%
  696.     CLOSE #1
  697.     @affiche_map
  698.   ENDIF
  699. fin_load_map:
  700.   @affiche_ligne_block
  701.   @inverse_old
  702. RETURN
  703. '
  704. > PROCEDURE save_map
  705.   path$=path_map$
  706.   titre$="SAVING MAP"
  707.   @fileselector
  708.   IF file$=""
  709.     GOTO fin_save_map
  710.   ENDIF
  711.   drive$=LEFT$(file$)
  712.   IF taille%+4>DFREE(drive%)
  713.     ALERT 3," NOT ENOUGH|SPACE ON DISK",1,"[OK]",dummy%
  714.     GOTO fin_save_map
  715.   ENDIF
  716.   OPEN "o",#1,file$
  717.   DPOKE buffer%,largeur&
  718.   BPUT #1,buffer%,2
  719.   DPOKE buffer%,hauteur&
  720.   BPUT #1,buffer%,2
  721.   BPUT #1,map%,taille%
  722.   CLOSE #1
  723. fin_save_map:
  724.   @affiche_ligne_block
  725.   @inverse_old
  726. RETURN
  727. '
  728. PROCEDURE pick_block
  729.   BMOVE XBIOS(3),sav_screen%,32000
  730.   CLS
  731.   y_pick&=0
  732.   nb_ligne_pick&=INT((nb_bloc&-1)/20)+1
  733.   FOR t|=0 TO 3999
  734.     POKE (V:bugbuster$)+t|,0
  735.   NEXT t|
  736.   FOR t&=0 TO nb_bloc&-1
  737.     DPOKE (V:bugbuster$)+t&*2,t&
  738.   NEXT t&
  739.   REPEAT
  740.     @tempo
  741.     y%=MOUSEY
  742.     IF y%<1
  743.       IF y_pick&>0
  744.         DEC y_pick&
  745.       ENDIF
  746.     ENDIF
  747.     IF y%>192
  748.       IF y_pick&<nb_ligne_pick&-12
  749.         INC y_pick&
  750.       ENDIF
  751.     ENDIF
  752.     @affiche_map2
  753.   UNTIL MOUSEK=1
  754.   COLOR good_color|
  755.   '  REPEAT
  756.   ' UNTIL MOUSEK=0
  757.   DEFMOUSE souris_block|
  758.   REPEAT
  759.     @affiche_map2
  760.     x_start&=(MOUSEX AND &HFFF0)
  761.     y_start&=(MOUSEY AND &HFFF0)
  762.     flag_out|=0
  763.     IF y_start&>176
  764.       y_start&=176
  765.       flag_out|=1
  766.     ENDIF
  767.     LINE 0,y_start&,319,y_start&
  768.     LINE x_start&,0,x_start&,191
  769.   UNTIL MOUSEK=1
  770.   IF flag_out|=1
  771.     PRINT CHR$(7)
  772.     GOTO fin_get_block2
  773.   ENDIF
  774.   IF y_start&>176
  775.     y_start&=176
  776.   ENDIF
  777.   REPEAT
  778.     @affiche_map2
  779.     x_end&=(MOUSEX AND &HFFF0)+15 !si bug enlever les ANDs
  780.     y_end&=(MOUSEY AND &HFFF0)+15
  781.     IF x_end&<=x_start&
  782.       x_end&=x_start&+15
  783.     ENDIF
  784.     IF y_end&<=y_start&
  785.       y_end&=y_start&+15
  786.     ENDIF
  787.     IF y_end&>191
  788.       y_end&=191
  789.     ENDIF
  790.     LINE x_start&,y_start&,x_end&,y_start&
  791.     LINE x_end&,y_start&,x_end&,y_end&
  792.     LINE x_end&,y_end&,x_start&,y_end&
  793.     LINE x_start&,y_end&,x_start&,y_start&
  794.   UNTIL MOUSEK<>1
  795.   x_start&=x_start&/16
  796.   y_start&=y_start&/16
  797.   x_end&=(x_end&/16)+1 !si bug rajouter 1 a x et y_end&
  798.   y_end&=(y_end&/16)+1
  799.   hauteur_du_block&=(y_end&-y_start&)-1
  800.   largeur_du_block&=(x_end&-x_start&)
  801.   block_buffer2%=block_buffer%
  802. copie_dans_buffer2:
  803.   adr_ds_map_du_buffer%=V:bugbuster$+((x_start&+(y_pick&+y_start&)*20)*2)
  804.   BMOVE adr_ds_map_du_buffer%,block_buffer2%,largeur_du_block&*2
  805.   ADD block_buffer2%,largeur_du_block&*2
  806.   INC y_start&
  807.   IF y_start&<y_end&
  808.     GOTO copie_dans_buffer2
  809.   ENDIF
  810. fin_get_block2:
  811.   REPEAT
  812.   UNTIL MOUSEK=0
  813.   DEFMOUSE 0
  814.   BMOVE sav_screen%,XBIOS(3),32000
  815. RETURN
  816.